#include<iostream>
#include<cerrno>
#include<cstring>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<string>

const int size=1024;

std::string getOtherMessage()
{
    static int cnt=0;
    std::string messageid=std::to_string(cnt);
    cnt++;
    pid_t self_id=getpid();
    std::string stringpid=std::to_string(self_id);

    std::string message="messageid: ";
    message+=messageid;
    message+="my pid is: ";
    message+=stringpid;

    return message;
}

//子进程进行写入
void subProcessWrite(int wfd)
{
    std::string message="father,I am your son process!";
    int pipesize=0;
    char c='A';
    while(true)
    {
        // std::string info=message+getOtherMessage();  //子进程发送给父进程的消息
        // write(wfd,info.c_str(),info.size()); //写入管道没有写入\0，没有必要写进去
        // sleep(1);
        write(wfd,&c,1);
        std::cout << "pipesize: " << ++pipesize << " write charator is : "<< c++ << std::endl;
        if(c=='G') break;
        sleep(1);
    }
    std::cout<<"child quit..."<<std::endl;
}


//父进程进行读取
void fatherProcessRead(int rfd)
{
    char inbuffer[size];
    while(true)
    {
        ssize_t n=read(rfd,inbuffer,sizeof(inbuffer)-1);
        if(n>0)
        {
            inbuffer[n]=0;  //==\0
            std::cout<<"father get message: "<<inbuffer<<std::endl;
        }
        else if(n==0)
        {
            // 如果read的返回值是0，表示写端直接关闭了，我们读到了文件的结尾
            std::cout << "client quit, father get return val: " << n << " father quit too!" << std::endl;
            break;
        }
        else if(n < 0)
        {
            std::cerr << "read error" << std::endl;
            break;
        }
    }
}

int main()
{
    int pipefd[2];
    int n=pipe(pipefd);
    if(n!=0)
    {
        std::cerr<<"errno: "<<errno<<": "<<"errstring: "<<strerror(errno)<<std::endl;
        return 1;
    }

    std::cout<<"pipefd[0]"<<",pipefd[1]: "<<pipefd[1]<<std::endl;
    sleep(1);

    //创建子进程
    pid_t id=fork();
    if(id==0)
    {   
        std::cout<<"子进程关闭不需要的fd，准备发消息"<<std::endl;
        sleep(1);
        //子进程 write
        //关闭不需要的fd
        close(pipefd[0]);
        subProcessWrite(pipefd[1]);
        close(pipefd[1]);
        exit(0);
    }

    std::cout<<"父进程关闭不需要的fd，准备收消息"<<std::endl;
    sleep(1);
    //父进程 read
    //关闭不需要的fd
    close(pipefd[1]);
    fatherProcessRead(pipefd[0]);
    close(pipefd[0]);
    
    pid_t rid=waitpid(id,nullptr,0);
    if(rid>0)
    {
        std::cout<<"wait child process done"<<std::endl;
    }
    return 0;
}

